#ifndef VIDEOTRANSCODER_H
#define VIDEOTRANSCODER_H

#include <QObject>
#include <QProcess>
#include <QString>
#include <QStringList>
#include <QDir>
#include <QFileInfo>
#include <QDateTime>
#include <QRegularExpression>

/**
 * @brief 视频信息结构体
 */
struct VideoInfo {
    QString filePath;           // 文件路径
    int width;                  // 分辨率-宽
    int height;                 // 分辨率-高
    QString codec;              // 视频编码
    int frameRate;              // 帧率
    int bitrate;                // 码率(kbps)
    qint64 duration;            // 时长(毫秒)
    bool needsTranscode;        // 是否需要转码
    
    VideoInfo() 
        : width(0), height(0), frameRate(0), bitrate(0), duration(0), needsTranscode(false) {}
};

/**
 * @brief 视频转码器类
 * 
 * 负责：
 * 1. 检测视频参数
 * 2. 判断是否需要转码
 * 3. 执行转码（硬件加速优先）
 * 4. 缓存管理
 */
class VideoTranscoder : public QObject
{
    Q_OBJECT

public:
    explicit VideoTranscoder(QObject *parent = nullptr);
    ~VideoTranscoder();

    /**
     * @brief 检查FFmpeg依赖
     * @return 是否可用
     */
    bool checkDependencies();

    /**
     * @brief 检测视频信息
     * @param filePath 视频文件路径
     * @return 视频信息结构体
     */
    VideoInfo detectVideoInfo(const QString &filePath);

    /**
     * @brief 转码视频
     * @param inputPath 输入文件路径
     * @param outputPath 输出文件路径
     * @return 是否成功
     */
    bool transcodeVideo(const QString &inputPath, const QString &outputPath);

    /**
     * @brief 获取转码后的缓存路径
     * @param originalPath 原始文件路径
     * @return 缓存文件路径
     */
    QString getCachedVideoPath(const QString &originalPath);

    /**
     * @brief 检查并清理缓存
     */
    void checkAndCleanCache();

    /**
     * @brief 清空所有缓存
     */
    void clearAllCache();

    /**
     * @brief 获取缓存大小
     * @return 缓存总大小(字节)
     */
    qint64 getCacheSize();

    /**
     * @brief 停止当前转码
     */
    void stopTranscode();

signals:
    /**
     * @brief 转码进度信号
     * @param progress 进度(0-100)
     */
    void transcodeProgress(int progress);

    /**
     * @brief 转码完成信号
     * @param success 是否成功
     * @param outputPath 输出文件路径
     */
    void transcodeFinished(bool success, const QString &outputPath);

    /**
     * @brief 错误信号
     * @param errorMsg 错误信息
     */
    void errorOccurred(const QString &errorMsg);

private slots:
    /**
     * @brief 处理FFmpeg标准输出
     */
    void onProcessReadyReadStandardOutput();
    
    /**
     * @brief 处理FFmpeg错误输出
     */
    void onProcessReadyReadStandardError();
    
    /**
     * @brief 处理进程完成
     */
    void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);

private:
    /**
     * @brief 解析FFmpeg输出获取视频信息
     * @param output FFmpeg输出
     * @param filePath 文件路径
     * @return 视频信息
     */
    VideoInfo parseVideoInfo(const QString &output, const QString &filePath);

    /**
     * @brief 判断是否需要转码
     * @param info 视频信息
     * @return 是否需要转码
     */
    bool needsTranscode(const VideoInfo &info);

    /**
     * @brief 创建缓存目录
     */
    void createCacheDir();

    /**
     * @brief 解析转码进度
     * @param output FFmpeg输出
     * @return 进度百分比
     */
    int parseTranscodeProgress(const QString &output);

    /**
     * @brief 提取分辨率
     * @param output FFmpeg输出
     * @param width 输出宽度
     * @param height 输出高度
     */
    void extractResolution(const QString &output, int &width, int &height);

    /**
     * @brief 提取帧率
     * @param output FFmpeg输出
     * @return 帧率
     */
    int extractFrameRate(const QString &output);

    /**
     * @brief 提取视频编码
     * @param output FFmpeg输出
     * @return 编码格式
     */
    QString extractCodec(const QString &output);

    /**
     * @brief 提取码率
     * @param output FFmpeg输出
     * @return 码率(kbps)
     */
    int extractBitrate(const QString &output);

    /**
     * @brief 提取时长
     * @param output FFmpeg输出
     * @return 时长(毫秒)
     */
    qint64 extractDuration(const QString &output);

    QProcess *m_process;                // FFmpeg进程
    bool m_hasHardwareEncoder;          // 是否有硬件编码器
    QString m_cacheDir;                 // 缓存目录路径
    qint64 m_videoDuration;             // 当前转码视频时长(毫秒)
    QString m_currentOutputPath;        // 当前输出路径
    QString m_ffmpegOutput;             // FFmpeg输出缓存
    
    // 最佳播放参数（针对IMX6ULL）
    static const int OPTIMAL_WIDTH = 640;
    static const int OPTIMAL_HEIGHT = 480;
    static const int OPTIMAL_FRAMERATE = 25;
    static const int OPTIMAL_BITRATE = 1500;  // kbps
    static const qint64 MAX_CACHE_SIZE = 1024 * 1024 * 1024; // 1GB
    static const int CACHE_EXPIRE_DAYS = 7;   // 7天
};

#endif // VIDEOTRANSCODER_H

